package com.niuwa.p2p.core.finance.repay;

import java.math.BigDecimal;
import java.util.Date;

import com.niuwa.p2p.core.finance.CostCalculatorHelper;
import com.niuwa.p2p.core.utils.DateUtil;
import com.niuwa.p2p.entity.business.RepayPlan;

/**
 * 还款 
 * 实现getRepayShould,算出当期应该还款(逾期还款) 
 * 
 * @title Repay.java
 *
 * @author 计盛君
 * @version 1.0
 * @created 2015年4月29日
 */
public class RepayOverdue extends Repay {

	/** 
	 * 根据已经存入DB的当期还款信息和还款日，结合借款信息（合同本金，借款方式等）计算费率，算出应还金额
	 * 
	 * 逾期还款=本金+逾期利息（当期应还利息+超期利息）+逾期管理服务费
	 * 或者 逾期还款=本金利息（本金+当期应还利息）+超期利息+逾期管理服务费
	 *   （超期利息=当期应还金额*日利率*逾期天数）  
	 * 
	 * @param loanInfo 借款信息
	 * @param RepayPlan   当期还款信息
	 * @param repaymentDay 还款日
	 * @return 还款金额
	 * @throws Exception 
	 */
	@Override
	public BigDecimal getRepayShould(LoanInfoVo loanInfoVo, RepayPlan repayPlan, Date repaymentDay, IRepayCallback repayCallback) throws Exception {
				
		int overdueDays = 0;
		// 还款日 <= 当月计划还款日, 抛出 错误（业务逻辑错误，不是逾期）
		if(DateUtil.compare(repaymentDay, repayPlan.getRepayDate()) <= 0) {
			throw new Exception();
		}else if(DateUtil.compare(repaymentDay, repayPlan.getRepayDate()) > 0 && DateUtil.compare(repaymentDay, DateUtil.addMonths(repayPlan.getRepayDate(), +1)) <= 0) {
			// 当月计划还款日 < 还款日 <= 下月计划还款日, 逾期天数 = 当期还款应还日
			overdueDays = DateUtil.getDaysBetween(repayPlan.getRepayDate(), repaymentDay);
		}else if(DateUtil.isAfter(repaymentDay, DateUtil.addMonths(repayPlan.getRepayDate(), +1))) {
			// 还款日 > 下月计划还款日 , 逾期天数 = 下月计划还款日  - 当月计划还款日  (即:正期逾期)
			overdueDays = DateUtil.getDaysBetween(repayPlan.getRepayDate(), DateUtil.addMonths(repayPlan.getRepayDate(), +1));
		}	
		
		BigDecimal dayRate = loanInfoVo.getRepayRate();
		// DICT TODO
		if(loanInfoVo.getRateType().equals("年")){
			dayRate = CostCalculatorHelper.rateConvert(loanInfoVo.getRepayRate(), "YEAR_TO_DAY");
		}else if(loanInfoVo.getRateType().equals("月")){
			dayRate = CostCalculatorHelper.rateConvert(loanInfoVo.getRepayRate(), "MONTH_TO_DAY");
		}
		
		// 逾期还款=本金利息（本金+当期应还利息）+超期利息+逾期管理服务费
		return repayPlan.getRepayAmount().add(CostCalculatorHelper.overdueInterest(repayPlan.getRepayAmount(), dayRate, overdueDays)
				              ).add(CostCalculatorHelper.overduePlatformFee(loanInfoVo.getRepayTotalAmount(), loanInfoVo.getPlatformFeeRate(), overdueDays));
	}
		
	
}
